/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op;

import core.CreateConta;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Jônatas
 */
public class CreateContaVivo2 implements CreateConta {

    public static Pattern telefoneDDD = Pattern.compile("[0-9]{2}-[0-9]{4}-[0-9]{4}");
    public static Pattern numero = Pattern.compile("[0-9]+");
    public static Pattern tempo = Pattern.compile("[0-9]{2}h[0-9]{2}m[0-9]{2}s");
    public static Pattern data = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{2}");
    public static Pattern valor = Pattern.compile("[0-9]+,[0-9]{2}");
    public static Pattern operadoraPattern = Pattern.compile("[0-9]{2}");

    public static Telefone createTelefone(String telefoneStrTemp) {
        String ddd = "0" + telefoneStrTemp.substring(0, 2);
        String num1 = telefoneStrTemp.substring(3, 7);
        String num2 = telefoneStrTemp.substring(8);

        return new Telefone(ddd, num1, num2);
    }

    public ContaTelefonica createConta(String[] fullFile) throws Exception {

        Telefone origem = null;

        ContaTelefonica contaTelefonica = new ContaTelefonica();

        contaTelefonica.contaMensal = new ArrayList<EntradaAbstrata>();
        String tipo = null;
        boolean aCobrar = false;

        for (int i = 0; i < fullFile.length; i++) {
            String line = fullFile[i].trim();

            if (line.contains("mero do Celular:")) {
                Matcher matchTelefone = telefoneDDD.matcher(line);

                if (matchTelefone.find()) {
                    String telefoneStrTemp = matchTelefone.group();

                    Telefone telefoneTemp = createTelefone(telefoneStrTemp);
                    if (!telefoneTemp.equals(origem)) {
                        origem = telefoneTemp;
                    }
                    continue;
                }

                matchTelefone = telefoneDDD.matcher(fullFile[i - 2]);

                if (matchTelefone.find()) {
                    String telefoneStrTemp = matchTelefone.group();

                    Telefone telefoneTemp = createTelefone(telefoneStrTemp);
                    if (!telefoneTemp.equals(origem)) {
                        origem = telefoneTemp;
                    }
                    continue;
                }

            }

            if (origem == null) {
                continue;
            }

            if (line.startsWith("Vivo Internet")) {
                tipo = "Vivo Internet";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Chamadas Locais Originadas")) {
                tipo = "Chamadas Locais Originadas Para Vivo";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Para Fixo")) {
                tipo = "Chamadas Locais Originadas Para Fixo";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Para Celulares de Outra Operadora")) {
                tipo = "Chamadas Locais Originadas Para Celulares de Outra Operadora";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Para Celulares de Grupo")) {
                tipo = "Chamadas Locais Originadas Para Celulares de Grupo";
                aCobrar = false;
                continue;
            }

            if (line.matches("Servi.os")) {
                tipo = "Serviços";
                aCobrar = false;
                continue;
            }

            if (line.matches("Servi.os Adicionais")) {
                tipo = "Serviços Adicionais";
                aCobrar = false;
                continue;
            }

            if (line.matches("Planos Contratados")) {
                tipo = "Serviços Adicionais";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Descontos") && line.contains("Subtotal")) {
                tipo = "Descontos";
                aCobrar = false;
                continue;
            }

            if (line.contains("Anteriores")) {
                tipo = "Chamadas de Períodos Anteriores";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Chamadas Recebidas a Cobrar - Locais")) {
                tipo = "Chamadas Recebidas a Cobrar - Locais";
                aCobrar = true;
                continue;
            }

            if (line.startsWith("Chamadas Recebidas a Cobrar - Exceto Locais")) {
                tipo = "Chamadas Recebidas a Cobrar - Exceto Locais";
                aCobrar = true;
                continue;
            }

            if (line.matches("Chamadas para N.meros - 0500")) {
                tipo = "Chamadas para Números - 0500";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Torpedos")) {
                tipo = "Torpedos";
                aCobrar = false;
                continue;
            }

            ///////////////////////////////////////// Chamadas Recebidas a Cobrar - Exceto Locais



            if (line.matches("Chamadas de Longa Dist.ncia Para Dentro do Estado")) {

                tipo = "Chamadas de Longa Distância Para Dentro do Estado";
                String operadora = fullFile[i + 1].trim();

                Matcher matcher = operadoraPattern.matcher(operadora);

                if (operadora.startsWith("LONGA DIST") && matcher.find()) {
                    tipo += " - " + matcher.group();
                }
                aCobrar = false;
                continue;
            }

            if (line.matches("Chamadas de Longa Dist.ncia Para Outros Estados")) {

                tipo = "Chamadas de Longa Distância Para Outros Estados";
                String operadora = fullFile[i + 1].trim();
                Matcher matcher = operadoraPattern.matcher(operadora);

                if (operadora.startsWith("LONGA DIST") && matcher.find()) {
                    tipo += " - " + matcher.group();
                }
                aCobrar = false;
                continue;
            }

            if (line.matches("Chamadas Fora da .rea de Registro")) {
                tipo = "Chamadas Fora da Área de Registro";
                aCobrar = false;
                continue;
            }//

            if (line.matches("Servi.o de Voz")) {
                tipo = "Serviço de Voz";
                aCobrar = false;
                continue;
            }//

            if (line.startsWith("Vivo Wap")) {
                tipo = "Vivo Wap";
                aCobrar = false;
                continue;
            }//


            if (tipo == null || tipo.isEmpty()) {
                continue;
            }
            Matcher matchHora = tempo.matcher(line);
            Matcher matchData = data.matcher(line);
            Matcher matchValor = valor.matcher(line);

            if ((matchHora.find() && matchData.find())
                    || ((tipo.equals("Serviços Adicionais") || tipo.equals("Planos Contratados")) && matchData.find() && !line.contains("Subtotal"))
                    || (tipo.equals("Descontos") && matchValor.find()) && !line.contains("Subtotal") && line.contains("CR")) {
                Map<String, Object> parametersMap = new HashMap<String, Object>();
                parametersMap.put("origem", origem);
                parametersMap.put("tipo", tipo);
                parametersMap.put("aCobrar", new Boolean(aCobrar));
                parametersMap.put("line", line);


                EntradaAbstrata entrada = new QuebraStringVivo2().quebraString(parametersMap);

                if (entrada == null) {
                    continue;
                }

                contaTelefonica.contaMensal.add(entrada);
            }

        }

        Collections.sort(contaTelefonica.contaMensal, new ComparatorEntradaAbstrataPorTelefone());

        contaTelefonica.contaResumida();

        return contaTelefonica;
    }
}
